<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>functionProperty</title>
<script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>

<script>
$(document).ready(function () {

//	testFunctionProperty1();
	testFunctionProperty2();
//	testFunctionProperty3();
	
});

function testFunctionProperty3() {
	
	// myFunc 함수(객체)는 Java의 HashMap 이라고 생각하면 된다.
	// key에 해당하는 param을 변수로 넘겨주면
	// 결과로 해당 key에 해당하는 값-프로퍼티(객체)를 넘겨준다.
	var myFunc = function (param) {
		
		var f = arguments.callee,
				result;
		
		if (!f.cache[param]) {
			console.log(f.cache[param]);
			var result = {};
			// ... 비용이 많이 드는 수행 ...
			result.maxCount = 33;
			
			f.cache[param] = result;
		}
		return f.cache[param];
	};
	
	// 캐시 저장공간
	myFunc.cache = {};
	
	console.log(myFunc("max").maxCount);
	console.log(myFunc("max").maxCount);
	console.log(myFunc("max").maxCount);
	
}

function testFunctionProperty2() {
	
	// myFunc 함수(객체)는 Java의 HashMap 이라고 생각하면 된다.
	// key에 해당하는 param을 변수로 넘겨주면
	// 결과로 해당 key에 해당하는 값-프로퍼티(객체)를 넘겨준다.
	var myFunc = function () {
		
		var cachekey = JSON.stringify(
				Array.prototype.slice.call(arguments), result);
		
		//console.log(Array.prototype.slice.call(arguments));
		
		var args = Array.prototype.slice.call(arguments, 1).concat(Array.prototype.slice.call(arguments));
		
		console.log(args);
		
		// ["2", "3", "1", "2", "3"]
		
		if (!myFunc.cache[cachekey]) {
			console.log(myFunc.cache[cachekey]);
			var result = {};
			// ... 비용이 많이 드는 수행 ...
			result.maxCount = 55;
			
			myFunc.cache[cachekey] = result;
		}
		return myFunc.cache[cachekey];
	};
	
	// 캐시 저장공간
	myFunc.cache = {};
	
	console.log(myFunc("max", "min", "whitebear").maxCount);
	console.log(myFunc("max").maxCount);
	console.log(myFunc("max").maxCount);
	
}

function testFunctionProperty1() {
	
	// myFunc 함수(객체)는 Java의 HashMap 이라고 생각하면 된다.
	// key에 해당하는 param을 변수로 넘겨주면
	// 결과로 해당 key에 해당하는 값-프로퍼티(객체)를 넘겨준다.
	var myFunc = function (param) {
		
		console.log(param);
		
		if (!myFunc.cache[param]) {
			console.log(myFunc.cache[param]);
			var result = {};
			// ... 비용이 많이 드는 수행 ...
			result.maxCount = 88;
			
			myFunc.cache[param] = result;
		}
		return myFunc.cache[param];
	};
	
	// 캐시 저장공간
	myFunc.cache = {};
	
	console.log(myFunc("max", "min", "whitebear").maxCount);
	console.log(myFunc("max").maxCount);
	console.log(myFunc("max").maxCount);
	
}

</script>

</head>
    <body>
	    <h3>함수 프로퍼티 - 메모이제이션(Memoization)패턴</h3>
    </body>
</html>